combobox: Use ui file to construct internal button child
authorBenjamin Otte <otte@redhat.com>
Sat, 25 Jul 2015 22:06:46 +0000 (00:06 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 26 Jul 2015 15:18:42 +0000 (17:18 +0200)
gtk/Makefile.am
gtk/gtkcombobox.c
gtk/ui/gtkcombobox.ui [new file with mode: 0644]

index 7f8b72b6406e964769321b3a1d89cb865a581c00..4fd509cdac9c98da303d0acb4be0a98280e04e72 100644 (file)
@@ -1079,6 +1079,7 @@ templates =                               \
        ui/gtkassistant.ui              \
        ui/gtkcolorchooserdialog.ui     \
        ui/gtkcoloreditor.ui            \
+       ui/gtkcombobox.ui               \
        ui/gtkdialog.ui         \
        ui/gtkfilechooserbutton.ui      \
        ui/gtkfilechooserwidget.ui      \
index e3bb2506f6bb42e983e4091c1b06dc3def579095..a079158b2a37434e73d1ec03020796642dd293a5 100644 (file)
@@ -415,6 +415,10 @@ static gchar   *gtk_combo_box_format_entry_text              (GtkComboBox     *c
 static GtkBuildableIface *parent_buildable_iface;
 
 static void     gtk_combo_box_buildable_init                 (GtkBuildableIface *iface);
+static void     gtk_combo_box_buildable_add_child            (GtkBuildable  *buildable,
+                                                              GtkBuilder    *builder,
+                                                              GObject       *child,
+                                                              const gchar   *type);
 static gboolean gtk_combo_box_buildable_custom_tag_start     (GtkBuildable  *buildable,
                                                               GtkBuilder    *builder,
                                                               GObject       *child,
@@ -1058,6 +1062,11 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
                                                               GTK_SHADOW_NONE,
                                                               GTK_PARAM_READABLE));
 
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/ui/gtkcombobox.ui");
+  gtk_widget_class_bind_template_child_internal_private (widget_class, GtkComboBox, button);
+  gtk_widget_class_bind_template_child_internal_private (widget_class, GtkComboBox, arrow);
+  gtk_widget_class_bind_template_callback (widget_class, gtk_combo_box_button_toggled);
+
   gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_COMBO_BOX_ACCESSIBLE);
 }
 
@@ -1065,7 +1074,7 @@ static void
 gtk_combo_box_buildable_init (GtkBuildableIface *iface)
 {
   parent_buildable_iface = g_type_interface_peek_parent (iface);
-  iface->add_child = _gtk_cell_layout_buildable_add_child;
+  iface->add_child = gtk_combo_box_buildable_add_child;
   iface->custom_tag_start = gtk_combo_box_buildable_custom_tag_start;
   iface->custom_tag_end = gtk_combo_box_buildable_custom_tag_end;
   iface->get_internal_child = gtk_combo_box_buildable_get_internal_child;
@@ -1113,19 +1122,9 @@ gtk_combo_box_init (GtkComboBox *combo_box)
   priv->text_renderer = NULL;
   priv->id_column = -1;
 
-  priv->button = gtk_toggle_button_new ();
-  gtk_button_set_focus_on_click (GTK_BUTTON (priv->button),
-                                 priv->focus_on_click);
+  gtk_widget_init_template (GTK_WIDGET (combo_box));
 
-  g_signal_connect (priv->button, "toggled",
-                    G_CALLBACK (gtk_combo_box_button_toggled), combo_box);
-  gtk_widget_set_parent (priv->button, GTK_WIDGET (combo_box));
-
-  priv->arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
-  gtk_container_add (GTK_CONTAINER (priv->button), priv->arrow);
   gtk_widget_add_events (priv->button, GDK_SCROLL_MASK);
-
-  gtk_widget_show_all (priv->button);
 }
 
 static void
@@ -5216,6 +5215,20 @@ gtk_combo_box_get_focus_on_click (GtkComboBox *combo_box)
   return combo_box->priv->focus_on_click;
 }
 
+static void
+gtk_combo_box_buildable_add_child (GtkBuildable *buildable,
+                                   GtkBuilder   *builder,
+                                   GObject      *child,
+                                   const gchar  *type)
+{
+  if (GTK_IS_WIDGET (child))
+    {
+      parent_buildable_iface->add_child (buildable, builder, child, type);
+      return;
+    }
+
+  _gtk_cell_layout_buildable_add_child (buildable, builder, child, type);
+}
 
 static gboolean
 gtk_combo_box_buildable_custom_tag_start (GtkBuildable  *buildable,
diff --git a/gtk/ui/gtkcombobox.ui b/gtk/ui/gtkcombobox.ui
new file mode 100644 (file)
index 0000000..cd06621
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk30">
+  <!-- interface-requires gtk+ 3.10 -->
+  <template class="GtkComboBox" parent="GtkBin">
+    <child>
+      <object class="GtkToggleButton" id="button">
+        <property name="visible">True</property>
+        <property name="focus-on-click">True</property>
+        <signal name="toggled" handler="gtk_combo_box_button_toggled" swapped="no"/>
+        <child>
+          <object class="GtkImage" id="arrow">
+            <property name="visible">True</property>
+            <property name="icon-name">pan-down-symbolic</property>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>